Single cell difference expression analysis ( C9orf72 )

C9

From the 43 deconvolved cells, only 28 had sufficient expression levels for EdgeR to perform differential expression analysis. Among these, 15 distinct cell types showed significant differential gene expression. RORB/POU3F2 characterized excitatory neuron exhibited the highest anount of alterations, with 433 differentially expressed genes (DEGs) and RORB/LRRK1 (263 DEGs) was also notably affected. For the inhibitory neurons we found DEG in the cells characterized by CUX2/RASGRF2 123, LAMP5/PMEPA1 22. Smooth muscle cells (SMC) also shown 270 DEG. Vascular cells such as arterial, and capillary subtypes displayed 52 and 63 deregulated genes respectively. T cells contributed with 33 DEGs. Across all cell types, upregulated genes were more frequent than downregulated ones.

Excitatory neurons

Differences in excitatory neuron composition reveal key changes in RORB-characterized subtypes. Differential gene expression analysis at cell state resolution identified downregulation of the disease-associated gene C9orf72 in the CUX2/RASGRF2 (adjusted p= 0,016 FC: 0.75), RORB/LRRK1(adjusted p= 0,026; FC: 0.78), and RORB/POU3F2 (adjusted p= 0,033; FC: 0,79) subtypes (PMCID: PMC3430713). Additionally, inflammatory marker genes were upregulated across excitatory neuron subtypes. For example, CHI3L1 was found upregulated in RORB/POU3F2(adjusted p=: 0,036; FC: 2,69) , consistent with its known elevation in cerebrospinal fluid as a biomarker (PMID: 32344399).

Hemoglobin subunits HBA1 in RORB/LRRK1 (adjusted p= 0,041; FC: 0,22) and RORB/POU3F2 (p= -0.04; FC: 0,22) and HBB in RORB/LRRK1 (adjusted p= 0,036; logFC: 0.23) and RORB/POU3F2 (adjusted p= 0,024; logFC: 0,23) also showed decreased expression that has been previously described in the frontal cortex of patents with neurodegenerative diseases (PMCID: PMC5786544). Functionally, downregulated genes in RORB/LRRK1 and RORB/POU3F2-expressing neurons are enriched in postsynaptic components and synaptic transmission. In the CUX2/RASGRF subtype, affected genes relate to postsynapse and transmission regulation. Upregulated genes in the CUX2/RASGRF subtype indicate enrichment in behavior, presinapse, and neuron apoptotic process, while in RORB/LRRK1 and RORB/POU3F2 subtypes, they relate to synaptic organization, behaviour and amyloid-beta response.

Inhibitory neurons

Inhibitory neurons display vulnerable transcriptional signatures in LAMP5/PMEPA1. Alterations in LAMP5/PMEPA1 expression involve genes without a previously established association with FTLD. Biological functions and pathways enriched among deregulated genes were observed exclusively in LAMP5/PMEPA1 neurons. These include enrichment of upregulated genes in axon and learning or memory, and for the downregulated genes synaptic vessicles, membrane and axon.

Non-neuronal

Among non-neuronal cell types—astrocytes (GFAP+ and GFAP-), microglia, and oligodendrocytes—a common reduction in HBB expression was observed in GFAP- (adjusted p= 0,043; FC: 0,23) and oligodendrocytes (adjusted p= 0,017; FC:, 0,22) (PMCID: PMC5786544). Functional enrichment analysis of deregulated genes in these cell types highlighted processes such as humoral immune response, axon guidance , memory, glial cell development and intrinsic apoptotic signaling pathway. Conversely, reductions were found in trans-synaptic signaling, social behavior and dendrites.

Vascular

Arterial, capillary, smooth muscle cells (SMCs), and T cells were grouped as vascular cells. Differential expression analysis showed reduced expression of HBB in SMC (adjusted p= 0,035; FC: 0,23), HBA1 in arterial (adjusted p= 0,032; FC: 0,23), capillary (adjusted p= 0,032; FC: 0,22) and SMCs (adjusted p= 0,013; FC: 0,21) and HBA2 in arterial (adjusted p= 0,042; FC: 0,23), capillary (adjusted p= 0,017; FC: 0,23 ) and SMCs (adjusted p= 1.26e-81; FC: 0.22 ) in FTLD. An additional notable finding points to an upregulation tendency of CXCL11 in SMC (adjusted p= 0,069; FC: 19,66).

Pathway analysis revealed increased activity in processes such as behaviour , regulation of neuron apoptotic process, neuropeptide signaling pathway. Reductions were observed in regulation of biological processes, synaptic vessicle exocytocis, secretion , presynaptic membrane, oxygen carier activity, postsynapse. Genes of interest DE Nominal p-values

Analysis of nominal p-values per gene and cell type in FTLD-C9 revealed a number of genes exhibiting p < 0.05 in specific cell populations, suggesting restricted transcriptional alterations. TUBA4A showed nominal significance in arterial cells (p = 0.011), capillaries (p = 0.006), CUX2/RASGRF2 neurons (p = 0.007), GFAP - astrocytes (p = 0.008), SST/NPY neurons (p = 0.003), T cells (p = 0.005), and THEMIS/TMEM233 cells (p = 0.006), indicating potential alterations in vascular, glial, and neuronal subtypes. FUS displayed significant nominal p-values in arterial cells (p = 0.002), capillaries (p = 0.005), CUX2/RASGRF2 neurons (p = 0.022), GFAP - astrocytes (p = 0.008), LAMP5/PMEPA1 neurons (p = 0.007), SST/NPY neurons (p = 0.018), T cells (p = 0.008), and THEMIS/TMEM233 cells (p = 0.009), suggesting widespread but cell type-specific transcriptional changes. C9orf72 exhibited striking nominal significance in arterial cells (p = 0.004), capillaries (p = 0.0003), CUX2/RASGRF2 neurons (p = 0.00004), GFAP - astrocytes (p = 0.0005), LAMP5/PMEPA1 neurons (p = 0.003), microglia (p = 0.002), oligodendrocytes (p = 0.008), SST/NPY neurons (p = 0.0002), T cells (p = 0.0005), and THEMIS/TMEM233 cells (p = 0.0004), confirming strong cell type-specific transcriptional effects. VCP showed significant p-values in arterial cells (p = 0.0002), capillaries (p = 0.00004), CUX2/RASGRF2 neurons (p = 0.0004), GFAP- astrocytes (p = 0.0002), microglia (p = 0.015), oligodendrocytes (p = 0.027), SST/NPY neurons (p = 0.0001), T cells (p = 0.00005), and THEMIS/TMEM233 cells (p = 0.0001), reflecting selective transcriptional dysregulation across multiple cell types. MATR3 presented nominal significance in arterial cells (p = 0.086), capillaries (p = 0.046), CUX2/RASGRF2 neurons (p = 0.042), GFAP - astrocytes (p = 0.047), LAMP5/PMEPA1 neurons (p = 0.061), microglia (p = 0.077), oligodendrocytes (p = 0.027), SST/NPY neurons (p = 0.032), and T cells (p = 0.032), suggesting moderate cell type-specific effects. DPP6 exhibited nominal significance in CDH4/SCGN neurons (p = 0.036), CUX2/RASGRF2 neurons (p = 0.003), GFAP + astrocytes (p = 0.003), microglia (p = 0.030), SST/NPY neurons (p = 0.005), and T cells (p = 0.024), indicating restricted but consistent alterations in excitatory neurons, astrocytes, and interneurons. Other genes such as NEFL, OPTN, GRN, TARDBP, HNRNPA1, MAPT, UNC13A, L3MBTL1, and VIPR1 displayed variable nominal significance across a few cell types, whereas many genes including NPTX2, UBQLN2, C19orf52, and ANO9 did not show any nominally significant changes in any cell type.

Sant Pau

Arterial

Code
counter <- 1
file <- "/media/jaumatell/datos/URI/BAYESPRISM_12_3/RESULTS_ORDERED/5. CELL TYPE DEA/ALL_FTLD_C9.xlsx"
sheets <- excel_sheets(file)

df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

Capillary

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

CDH4_CCK

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

CDH4_SCGN

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

CLMP_KCNMA1

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

CLMP_PDGFRA

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

CUX2_RASGRF2

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

CUX2_RORB

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

DISC1_CCK

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

DISC1_RELN

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

GFAP_neg

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

GFAP_pos

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

LAMP5_CA3

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

LAMP5_PMEPA1

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

Micro

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

Oligo

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

OPC

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

PCP4_NXPH2

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

Pericyte

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

PVALB_CEMIP

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

PVALB_MYBPC1

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

PVALB_PTHLH

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

RORB_ADGRL4

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

RORB_FOXO1

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

RORB_LRRK1

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

RORB_POU3F2

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

SCN4B_NEFH

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

SMC

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

SST_ADAMTS19

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

SST_BRINP3

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

SST_GALNT14

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

SST_NPY

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

T_Cell

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

THEMIS_NR4A2

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

THEMIS_TMEM233

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

TLE4_CCBE1

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

TLE4_MEGF11

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

TLE4_SEMA3D

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

VAT1L_EYA4

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

Venous

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

VIP_CLSTN2

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

VIP_HTR2C

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1

VIP_LAMA3

Code
df <- read_excel(file, sheet = sheets[counter])

# Show filterable interactive table
datatable(
  df,
  filter = "top",      # adds filter boxes on top
  options = list(
    pageLength = 25,   # default number of rows per page
    autoWidth = TRUE,
    scrollX = TRUE     # horizontal scroll if wide
  )
)
Code
counter <- counter+1